#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkAxesActor.h>
#include <vtkImageSlabReslice.h>
#include <vtkLookupTable.h>
#include <vtkImageMapToColors.h>
#include <vtkProperty.h>
#include <vtkAutoInit.h>

// 初始化VTK模块
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

// 创建单层图像数据（用于生成格网）
vtkSmartPointer<vtkImageData> CreateImageLayer(
    int size[2],       // 图像尺寸（宽×高）
    double origin[3],  // 原点坐标（z坐标决定层位置）
    double spacing[2], // 像素间距
    int gridSpacing)   // 网格线间隔（像素）
{
    // 1. 创建2D图像数据（z方向厚度为1的3D数据）
    vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
    image->SetDimensions(size[0], size[1], 1);      // 2D图像（z方向1层）
    image->SetOrigin(origin);                       // 原点（x,y,z）
    image->SetSpacing(spacing[0], spacing[1], 1.0); // 间距（z方向无意义）
    // image->SetScalarTypeToUnsignedChar();
    // image->SetNumberOfScalarComponents(1);
    image->AllocateScalars(VTK_UNSIGNED_SHORT, 1);

    // 2. 生成网格图案（网格线为白色，背景为黑色）
    unsigned char *data = static_cast<unsigned char *>(image->GetScalarPointer());
    int width = size[0];
    int height = size[1];

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            // 每隔gridSpacing像素绘制一条网格线（x或y方向）
            if (x % gridSpacing == 0 || y % gridSpacing == 0)
            {
                *data = 255; // 网格线（白色）
            }
            else
            {
                *data = 0; // 背景（黑色）
            }
            data++;
        }
    }

    return image;
}

// 创建带颜色映射的图像Actor
vtkSmartPointer<vtkImageActor> CreateLayerActor(
    vtkSmartPointer<vtkImageData> image,
    double color[3], // 网格线颜色（RGB 0-1）
    double opacity)  // 透明度
{
    // 1. 创建颜色映射表（将图像值映射到指定颜色）
    vtkSmartPointer<vtkLookupTable> lut = vtkSmartPointer<vtkLookupTable>::New();
    lut->SetNumberOfTableValues(2);
    lut->SetTableValue(0, 0, 0, 0, 0);                            // 背景（透明黑色）
    lut->SetTableValue(1, color[0], color[1], color[2], opacity); // 网格线颜色
    lut->Build();

    // 2. 应用颜色映射
    vtkSmartPointer<vtkImageMapToColors> colorMap = vtkSmartPointer<vtkImageMapToColors>::New();
    colorMap->SetInputData(image);
    colorMap->SetLookupTable(lut);
    colorMap->Update();

    // 3. 创建图像Actor
    vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
    actor->SetInputData(colorMap->GetOutput());
    return actor;
}

int main()
{
    // 1. 初始化渲染组件
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->SetBackground(0.1, 0.1, 0.1); // 深灰背景

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize(800, 600);
    renderWindow->SetWindowName("vtkImageData多层格网");

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    interactor->SetInteractorStyle(style);
    interactor->SetRenderWindow(renderWindow);

    // 替换 main 函数中创建图层的部分如下：

    // 第一层：底层大格网（蓝色，稀疏）
    int size1[2] = {50, 50};
    double origin1[3] = {-25, -25, -10};
    double spacing1[2] = {1.0, 1.0};
    auto image1 = CreateImageLayer(size1, origin1, spacing1, 10);
    double color1[3] = {0.0, 0.0, 1.0}; // 蓝色
    auto actor1 = CreateLayerActor(image1, color1, 0.8);
    renderer->AddActor(actor1);

    // 第二层：中层格网（绿色，中等密度）
    int size2[2] = {40, 40};
    double origin2[3] = {-20, -20, 0};
    double spacing2[2] = {1.0, 1.0};
    auto image2 = CreateImageLayer(size2, origin2, spacing2, 5);
    double color2[3] = {0.0, 1.0, 0.0}; // 绿色
    auto actor2 = CreateLayerActor(image2, color2, 0.6);
    renderer->AddActor(actor2);

    // 第三层：顶层小格网（红色，密集）
    int size3[2] = {30, 30};
    double origin3[3] = {-15, -15, 10};
    double spacing3[2] = {1.0, 1.0};
    auto image3 = CreateImageLayer(size3, origin3, spacing3, 3);
    double color3[3] = {1.0, 0.0, 0.0}; // 红色
    auto actor3 = CreateLayerActor(image3, color3, 0.7);
    renderer->AddActor(actor3);

    // 3. 添加坐标轴（辅助观察层级位置）
    vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
    axes->SetTotalLength(20, 20, 20);
    renderer->AddActor(axes);
    // 4. 启动交互
    renderer->ResetCamera();
    renderWindow->AddRenderer(renderer);

    renderWindow->Render();
    interactor->Initialize();
    interactor->Start();

    return 0;
}
